﻿Public Class SamengesteldeArtikelsForm

    ' TODO: met selection werken ipv currentrow?

    Private _mainForm As Form
    Private _currentHoofdartikelId As Integer

#Region "Constructors"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            InitGridHoofdartikels()
            InitGridDeelartikels()

            tsbBewaren.Enabled = False
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("SamengesteldeArtikelsForm_Load" & Environment.NewLine & ex.ToString())
        End Try
    End Sub

#End Region

#Region "Event handling"

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        QuerySluiten()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                QuerySluiten()
            Case Keys.F2
                If (Not tsbBewaren.Enabled) Then Return
                BewaarWijzigingen()
            Case Keys.F4
                ToevoegenDozen()
            Case Keys.F5
                AddHoofdartikel()
            Case Keys.F6
                AddDeelartikel()
        End Select
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub GridHoofdartikels_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles GridHoofdartikels.RowsAdded
        ' zorg ervoor dat een nieuw toegevoegde rij de huidige rij wordt
        Me.HoofdArtikelsDataSetBindingSource.Position = e.RowIndex
        Me.GridHoofdartikels.Rows(e.RowIndex).Selected = True
    End Sub

    Private Sub GridDeelartikels_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles GridDeelartikels.RowsAdded
        ' zorg ervoor dat een nieuw toegevoegde rij de huidige rij wordt
        Me.DeelArtikelsDataSetBindingSource.Position = e.RowIndex
        Me.GridDeelartikels.Rows(e.RowIndex).Selected = True
    End Sub

    Private Sub GridHoofdartikels_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles GridHoofdartikels.SelectionChanged
        If (Me.DeelArtikelsDataSet.HasChanges()) Then
            If (MessageBox.Show("Wil je de wijzigingen aan dit hoofdartikel bewaren?", "Bewaren", _
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes) Then
                BewaarWijzigingen()
            End If
        End If
        _currentHoofdartikelId = GetCurrentHoofdartikelId()
        Me.RefreshGridDeelartikels(_currentHoofdartikelId)
    End Sub

    Private Sub tsbAddHoofdartikel_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbAddHoofdartikel.Click, tsbNieuwHoofdartikel.Click
        AddHoofdartikel()
    End Sub

    Private Sub tsbAddDeelartikel_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbAddDeelartikel.Click, tsbNieuwDeelartikel.Click
        AddDeelartikel()
    End Sub

    Private Sub tsbDeleteHoofdartikel_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbDeleteHoofdartikel.Click
        'For Each row As DataGridViewRow In GridHoofdartikels.SelectedRows
        '    GridHoofdartikels.Rows.Remove(row)
        'Next
        If (GridHoofdartikels.CurrentRow IsNot Nothing) Then
            GridHoofdartikels.Rows.Remove(GridHoofdartikels.CurrentRow)
            _currentHoofdartikelId = GetCurrentHoofdartikelId()
            tsbBewaren.Enabled = True
        End If
    End Sub

    Private Sub tsbDeleteDeelartikel_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbDeleteDeelartikel.Click
        'For Each row As DataGridViewRow In GridDeelartikels.SelectedRows
        '    GridHoofdartikels.Rows.Remove(row)
        'Next
        If (GridDeelartikels.CurrentRow IsNot Nothing) Then
            GridDeelartikels.Rows.Remove(GridDeelartikels.CurrentRow)
            tsbBewaren.Enabled = True
        End If
    End Sub

    Private Sub tsbDozen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbDozen.Click
        ToevoegenDozen()
    End Sub

    Private Sub GridDeelartikels_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles GridDeelartikels.CellValueChanged
        tsbBewaren.Enabled = True
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub InitGridHoofdartikels()
        With DataGridViewHelper.GetGridColumnByDataName(HoofdArtikelsDataSet.Artikels.IdColumn.ColumnName, GridHoofdartikels)
            .Visible = False ' Autonumber niet tonen
        End With
        With DataGridViewHelper.GetGridColumnByDataName(HoofdArtikelsDataSet.Artikels.OmschrijvingColumn.ColumnName, GridHoofdartikels)
            .Width = 270
        End With
        With DataGridViewHelper.GetGridColumnByDataName(HoofdArtikelsDataSet.Artikels.BarcodeColumn.ColumnName, GridHoofdartikels)
            .Width = 140
        End With
        With DataGridViewHelper.GetGridColumnByDataName(HoofdArtikelsDataSet.Artikels.PrijsColumn.ColumnName, GridHoofdartikels)
            .Width = 70
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
            .ToolTipText = "De prijs van het hoofdartikel. Deze is meestal 0 omdat deze in de prijslijst van Oxfam niet ingevuld is."
        End With
        With DataGridViewHelper.GetGridColumnByDataName(HoofdArtikelsDataSet.Artikels.AantalColumn.ColumnName, GridHoofdartikels)
            .Visible = False ' aantal alleen tonen bij deelartikels, niet bij hoofdartikels
        End With
        SamengesteldeArtikelsDal.FillHoofdartikels(Me.HoofdArtikelsDataSet)
    End Sub

    Private Sub InitGridDeelartikels()
        With DataGridViewHelper.GetGridColumnByDataName(DeelArtikelsDataSet.Artikels.IdColumn.ColumnName, GridDeelartikels)
            .Visible = False ' Autonumber niet tonen
        End With
        With DataGridViewHelper.GetGridColumnByDataName(DeelArtikelsDataSet.Artikels.OmschrijvingColumn.ColumnName, GridDeelartikels)
            .Width = 270
        End With
        With DataGridViewHelper.GetGridColumnByDataName(DeelArtikelsDataSet.Artikels.BarcodeColumn.ColumnName, GridDeelartikels)
            .Width = 140
        End With
        With DataGridViewHelper.GetGridColumnByDataName(DeelArtikelsDataSet.Artikels.PrijsColumn.ColumnName, GridDeelartikels)
            .Width = 70
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(DeelArtikelsDataSet.Artikels.AantalColumn.ColumnName, GridDeelartikels)
            .Width = 60
            .ReadOnly = False
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
    End Sub

    Private Sub RefreshGridDeelartikels(ByVal hoofdartikelId As Integer)
        SamengesteldeArtikelsDal.FillDeelartikels(hoofdartikelId, Me.DeelArtikelsDataSet)
    End Sub

    Private Sub AddHoofdartikel()
        Me.Cursor = Cursors.WaitCursor
        Dim f As New ZoekArtikelForm("", True)
        If (f.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            Dim newRow As ArtikelLijstDataSet.ArtikelsRow = Me.HoofdArtikelsDataSet.Artikels.NewArtikelsRow()
            newRow.Id = f.Artikel.Id
            newRow.Artikelcode = f.Artikel.Artikelcode
            newRow.Barcode = f.Artikel.Barcode
            newRow.Prijs = f.Artikel.Prijs
            newRow.Omschrijving = f.Artikel.Omschrijving
            Me.HoofdArtikelsDataSet.Artikels.AddArtikelsRow(newRow)
        End If
        Me.Cursor = Cursors.Default
    End Sub

    Private Sub AddDeelartikel()
        Me.Cursor = Cursors.WaitCursor
        Dim f As New ZoekArtikelForm("", False)
        If (f.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            Dim newRow As ArtikelLijstDataSet.ArtikelsRow = Me.DeelArtikelsDataSet.Artikels.NewArtikelsRow()
            newRow.Id = f.Artikel.Id
            newRow.Artikelcode = f.Artikel.Artikelcode
            newRow.Barcode = f.Artikel.Barcode
            newRow.Prijs = f.Artikel.Prijs
            newRow.Omschrijving = f.Artikel.Omschrijving
            newRow.Aantal = 1
            Me.DeelArtikelsDataSet.Artikels.AddArtikelsRow(newRow)
            tsbBewaren.Enabled = True
        End If
        Me.Cursor = Cursors.Default
    End Sub

    Private Sub BewaarWijzigingen()
        GridHoofdartikels.EndEdit()
        GridDeelartikels.EndEdit()
        Try
            ' als er hoofdartikels verwijderd zijn, verwijder die ook in de databank
            SamengesteldeArtikelsDal.UpdateSamengesteldeArtikels(Me.HoofdArtikelsDataSet)

            ' als er deelartikels van het huidige hoofdartikel verwijderd zijn, verwijder die ook in de databank
            SamengesteldeArtikelsDal.UpdateSamengesteldeArtikels(_currentHoofdartikelId, Me.DeelArtikelsDataSet)

            Utility.ResetSamengesteldeArtikels()

            tsbBewaren.Enabled = False
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het bewaren van de samengestelde artikels")
            log.WriteError("SamengesteldeArtikelsForm_BewaarWijzigingen" & Environment.NewLine & ex.ToString())
        End Try
    End Sub

    Private Sub ToevoegenDozen()
        Dim f As New DozenToevoegForm()
        f.ShowDialog()
        ' TODO: dit zou zonder een refresh kunnen als we de doos rechtstreeks op de dataset zouden toevoegen
        InitGridHoofdartikels()
        InitGridDeelartikels()
    End Sub

    Private Function GetCurrentHoofdartikelId() As Integer
        If (Me.GridHoofdartikels.CurrentRow Is Nothing) Then Return 0
        Dim hoofdartikelId As Integer = Convert.ToInt32(DataGridViewHelper.GetValueFromDataGridRow( _
            Me.HoofdArtikelsDataSet.Artikels.IdColumn.ColumnName, Me.GridHoofdartikels.CurrentRow))
        Return hoofdartikelId
    End Function

    Private Sub QuerySluiten()
        If (tsbBewaren.Enabled) Then
            Dim result As DialogResult = MessageBox.Show("Er zijn nog niet bewaarde wijzigingen. Wil je deze bewaren?", "Nog niet bewaard", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
            Select Case result
                Case DialogResult.Yes
                    BewaarWijzigingen()
                    Me.Close()
                Case DialogResult.No
                    'Me.HoofdArtikelsDataSet.RejectChanges() ' niet nodig, deze zitten toch nog niet in Utility.Data
                    'Me.DeelArtikelsDataSet.RejectChanges()
                    Me.Close()
                Case DialogResult.Cancel
                    Return
            End Select
        Else ' niets te bewaren
            Me.Close()
        End If
    End Sub

#End Region

End Class